home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CreatingGames / Utilities / E / PsiloPlayer / Src / Modules / replay / jamcracker_replay.s < prev    next >
Encoding:
Text File  |  1995-11-24  |  12.4 KB  |  656 lines

  1.  
  2.     include    exec/types.i
  3.  
  4.     STRUCTURE UPS_USER,0
  5.     APTR    UPS_Voice1Adr
  6.     UWORD   UPS_Voice1Len
  7.     UWORD   UPS_Voice1Per
  8.     UWORD   UPS_Voice1Vol
  9.     UWORD   UPS_Voice1Note
  10.     UWORD   UPS_Voice1SampleNr
  11.     UWORD   UPS_Voice1SampleType
  12.     UWORD   UPS_Voice1Repeat
  13.     LABEL   UPS_Modulo
  14.     APTR    UPS_Voice2Adr
  15.     UWORD   UPS_Voice2Len
  16.     UWORD   UPS_Voice2Per
  17.     UWORD   UPS_Voice2Vol
  18.     UWORD   UPS_Voice2Note
  19.     UWORD   UPS_Voice2SampleNr
  20.     UWORD   UPS_Voice2SampleType
  21.     UWORD   UPS_Voice2Repeat
  22.     APTR    UPS_Voice3Adr
  23.     UWORD   UPS_Voice3Len
  24.     UWORD   UPS_Voice3Per
  25.     UWORD   UPS_Voice3Vol
  26.     UWORD   UPS_Voice3Note
  27.     UWORD   UPS_Voice3SampleNr
  28.     UWORD   UPS_Voice3SampleType
  29.     UWORD   UPS_Voice3Repeat
  30.     APTR    UPS_Voice4Adr
  31.     UWORD   UPS_Voice4Len
  32.     UWORD   UPS_Voice4Per
  33.     UWORD   UPS_Voice4Vol
  34.     UWORD   UPS_Voice4Note
  35.     UWORD   UPS_Voice4SampleNr
  36.     UWORD   UPS_Voice4SampleType
  37.     UWORD   UPS_Voice4Repeat
  38.     UWORD   UPS_DMACon
  39.     LABEL   UPS_SizeOF
  40.  
  41. JC_StructAdr    ds.b    UPS_SizeOF
  42.  
  43. JC_SetVoices:    move.l    d1,-(a7)
  44.         and.w    #$7f,d1
  45.         cmp.l    #$dff0a0,a0            ;Left Volume
  46.         bne.s    .NoVoice1
  47.         move.w    d1,UPS_Voice1Vol+JC_StructAdr
  48.         bra.b    .SetIt
  49. .NoVoice1:    cmp.l    #$dff0b0,a0            ;Right Volume
  50.         bne.s    .NoVoice2
  51.         move.w    d1,UPS_Voice2Vol+JC_StructAdr
  52.         bra.b    .SetIt
  53. .NoVoice2:    cmp.l    #$dff0c0,a0            ;Right Volume
  54.         bne.s    .NoVoice3
  55.         move.w    d1,UPS_Voice3Vol+JC_StructAdr
  56.         bra.b    .SetIt
  57. .NoVoice3:    move.w    d1,UPS_Voice4Vol+JC_StructAdr
  58. .SetIt:        move.w    d1,8(a0)
  59. .Return:    move.l    (a7)+,d1
  60.         rts
  61.  
  62. jc_zeroadr
  63.     movem.l    d0-d1/a2,-(sp)
  64.     lea    JC_StructAdr(pc),a2    ;1.Kanal
  65.     cmp.l    #$dff0a0,a0
  66.     beq.s    .yes
  67.     lea    JC_StructAdr+UPS_Modulo(pc),a2    ;2.Kanal
  68.     cmp.l    #$dff0b0,a0
  69.     beq.s    .yes
  70.     lea    JC_StructAdr+UPS_Modulo*2(pc),a2    ;3.Kanal
  71.     cmp.l    #$dff0c0,a0
  72.     beq.s    .yes
  73.     lea    JC_StructAdr+UPS_Modulo*3(pc),a2    ;4.Kanal
  74. .yes
  75.     clr.l    UPS_Voice1Adr(a2)
  76.     clr.w    UPS_Voice1Len(a2)
  77.     clr.w    UPS_Voice1Per(A2)
  78.     clr.w    UPS_Voice1Vol(a2)
  79.  
  80.     movem.l    (sp)+,d0-d1/a2
  81.     rts
  82. JC_GetVoice:
  83.     movem.l    d0-d1/a2,-(sp)
  84.     lea    JC_StructAdr(pc),a2    ;1.Kanal
  85.     cmp.l    #$dff0a0,a0
  86.     beq.s    .yes
  87.     lea    JC_StructAdr+UPS_Modulo(pc),a2    ;2.Kanal
  88.     cmp.l    #$dff0b0,a0
  89.     beq.s    .yes
  90.     lea    JC_StructAdr+UPS_Modulo*2(pc),a2    ;3.Kanal
  91.     cmp.l    #$dff0c0,a0
  92.     beq.s    .yes
  93.     lea    JC_StructAdr+UPS_Modulo*3(pc),a2    ;4.Kanal
  94. .yes
  95.     move.l    pv_insaddress(a1),UPS_Voice1Adr(a2)
  96.     move.w    pv_inslen(a1),UPS_Voice1Len(a2)
  97.     move.w    pv_pers(a1),UPS_Voice1Per(A2)
  98.  
  99.     movem.l    (sp)+,d0-d1/a2
  100.     rts
  101.  
  102.                   ****************************************
  103.                   *** JamCrackerPro V1.0a play-routine ***
  104.                   ***   Originally coded by M. Gemmel  ***
  105.                   ***           Code optimised         ***
  106.                   ***         by Xag of Betrayal       ***
  107.                   ***    See docs for important info   ***
  108.                   ****************************************
  109.  
  110.     *** Relative offset definitions ***
  111.  
  112.         RSRESET        ;Instrument info structure
  113. it_name        RS.B    31
  114. it_flags    RS.B    1
  115. it_size        RS.L    1
  116. it_address    RS.L    1
  117. it_sizeof    RS.W    0
  118.  
  119.         RSRESET        ;Pattern info structure
  120. pt_size        RS.W    1
  121. pt_address    RS.L    1
  122. pt_sizeof    RS.W    0
  123.  
  124.         RSRESET        ;Note info structure
  125. nt_period    RS.B    1
  126. nt_instr    RS.B    1
  127. nt_speed    RS.B    1
  128. nt_arpeggio    RS.B    1
  129. nt_vibrato    RS.B    1
  130. nt_phase    RS.B    1
  131. nt_volume    RS.B    1
  132. nt_porta    RS.B    1
  133. nt_sizeof    RS.W    0
  134.  
  135.         RSRESET        ;Voice info structure
  136. pv_waveoffset    RS.W    1
  137. pv_dmacon    RS.W    1
  138. pv_custbase    RS.L    1
  139. pv_inslen    RS.W    1
  140. pv_insaddress    RS.L    1
  141. pv_peraddress    RS.L    1
  142. pv_pers        RS.W    3
  143. pv_por        RS.W    1
  144. pv_deltapor    RS.W    1
  145. pv_porlevel    RS.W    1
  146. pv_vib        RS.W    1
  147. pv_deltavib    RS.W    1
  148. pv_vol        RS.W    1
  149. pv_deltavol    RS.W    1
  150. pv_vollevel    RS.W    1
  151. pv_phase    RS.W    1
  152. pv_deltaphase    RS.W    1
  153. pv_vibcnt    RS.B    1
  154. pv_vibmax    RS.B    1
  155. pv_flags    RS.B    2
  156. pv_sizeof    RS.W    0
  157.  
  158.  
  159.     *** Initialise routine ***
  160.  
  161.     XDEF    ppinit__i
  162.  
  163. ppinit__i    move.l    4(sp),a0
  164.         movem.l    d2-d7/a2-a6,-(sp)
  165.         bsr.s    pp_init
  166.         movem.l    (sp)+,d2-d7/a2-a6
  167.         rts
  168.  
  169. pp_init:addq.w    #4,a0
  170.     move.w    (a0)+,d0
  171.     move.w    d0,d1
  172.     move.l    a0,instable
  173.     mulu    #it_sizeof,d0
  174.     add.w    d0,a0
  175.  
  176.     move.w    (a0)+,d0
  177.     move.w    d0,d2
  178.     move.l    a0,patttable
  179.     mulu    #pt_sizeof,d0
  180.     add.w    d0,a0
  181.  
  182.     move.w    (a0)+,d0
  183.     move.w    d0,songlen
  184.     move.l    a0,songtable
  185.     add.w    d0,d0
  186.     add.w    d0,a0
  187.  
  188.     move.l    patttable(PC),a1
  189.     move.w    d2,d0
  190.     subq.w    #1,d0
  191. .l0:    move.l    a0,pt_address(a1)
  192.     move.w    (a1),d3        ;pt_size
  193.     mulu    #nt_sizeof*4,d3
  194.     add.w    d3,a0
  195.     addq.w    #pt_sizeof,a1
  196.     dbra    d0,.l0
  197.  
  198.     move.l    instable(PC),a1
  199.     move.w    d1,d0
  200.     subq.w    #1,d0
  201. .l1:    move.l    a0,it_address(a1)
  202.     move.l    it_size(a1),d2
  203.     add.l    d2,a0
  204.     add.w    #it_sizeof,a1
  205.     dbra    d0,.l1
  206.  
  207.     move.l    songtable(PC),pp_songptr
  208.     move.w    songlen(PC),pp_songcnt
  209.     move.l    pp_songptr(PC),a0
  210.     move.w    (a0),d0
  211.     mulu    #pt_sizeof,d0
  212.     add.l    patttable(PC),d0
  213.     move.l    d0,a0
  214.     move.l    a0,pp_pattentry
  215.     move.b    pt_size+1(a0),pp_notecnt
  216.     move.l    pt_address(a0),pp_address
  217.     move.b    #6,pp_wait
  218.     move.b    #1,pp_waitcnt
  219.     clr.l    pp_nullwave
  220.     move.w    #$000F,$DFF096
  221.  
  222.     lea    pp_variables(PC),a0
  223.     lea    $DFF0A0,a1
  224.     moveq    #1,d1
  225.     move.w    #$80,d2
  226.     moveq    #4-1,d0
  227. .l2:    move.w    #0,8(a1)
  228.     move.w    d2,(a0)        ;pv_waveoffset
  229.     move.w    d1,pv_dmacon(a0)
  230.     move.l    a1,pv_custbase(a0)
  231.     move.l    #pp_periods,pv_peraddress(a0)
  232.     move.w    #1019,pv_pers(a0)
  233.     clr.w    pv_pers+2(a0)
  234.     clr.w    pv_pers+4(a0)
  235.     clr.l    pv_por(a0)
  236.     clr.w    pv_porlevel(a0)
  237.     clr.l    pv_vib(a0)
  238.     clr.l    pv_vol(a0)
  239.     move.w    #$40,pv_vollevel(a0)
  240.     clr.l    pv_phase(a0)
  241.     clr.w    pv_vibcnt(a0)
  242.     clr.b    pv_flags(a0)
  243.     add.w    #pv_sizeof,a0
  244.     add.w    #$10,a1
  245.     add.w    d1,d1
  246.     add.w    #$40,d2
  247.     dbra    d0,.l2
  248.     rts
  249.  
  250.     *** Clean-up routine ***
  251.  
  252.     XDEF    ppend
  253.  
  254. ppend:    moveq    #0,d0
  255.     lea    $DFF000,a0
  256.     move.w    d0,$A8(a0)
  257.     move.w    d0,$B8(a0)
  258.     move.w    d0,$C8(a0)
  259.     move.w    d0,$D8(a0)
  260.     move.w    #$000F,$96(a0)
  261.     rts
  262.  
  263.     XDEF    ppplay
  264.  
  265. ppplay        movem.l    d0-a6,-(sp)
  266.         bsr.s    pp_play
  267.         movem.l    (sp)+,d0-a6
  268.         moveq    #1,d0
  269.         rts
  270.  
  271. pp_play    lea    $DFF000,a6
  272.     subq.b    #1,pp_waitcnt
  273.     bne.s    .l0
  274.  
  275.     bsr    pp_nwnt
  276.     move.b    pp_wait(PC),pp_waitcnt
  277.  
  278. .l0:    lea    pp_variables+0*pv_sizeof(PC),a1
  279.     bsr.s    pp_uvs
  280.     lea    pp_variables+1*pv_sizeof(PC),a1
  281.     bsr.s    pp_uvs
  282.     lea    pp_variables+2*pv_sizeof(PC),a1
  283.     bsr.s    pp_uvs
  284.     lea    pp_variables+3*pv_sizeof(PC),a1
  285. pp_uvs:
  286.     move.l    pv_custbase(a1),a0
  287.  
  288. .l0:    move.w    pv_pers(a1),d0
  289.     bne.s    .l1
  290.     bsr    pp_rot
  291.     bra.s    .l0
  292. .l1:    add.w    pv_por(a1),d0
  293.     tst.w    pv_por(a1)
  294.     beq.s    .l1c
  295.     bpl.s    .l1a
  296.     cmp.w    pv_porlevel(a1),d0
  297.     bge.s    .l1c
  298.     bra.s    .l1b
  299. .l1a:    cmp.w    pv_porlevel(a1),d0
  300.     ble.s    .l1c
  301. .l1b:    move.w    pv_porlevel(a1),d0
  302.  
  303. .l1c:    add.w    pv_vib(a1),d0
  304.     cmp.w    #135,d0
  305.     bge.s    .l1d
  306.     move.w    #135,d0
  307.     bra.s    .l1e
  308. .l1d:    cmp.w    #1019,d0
  309.     ble.s    .l1e
  310.     move.w    #1019,d0
  311. .l1e:    move.w    d0,6(a0)
  312.     bsr    pp_rot
  313.  
  314.     move.w    pv_deltapor(a1),d0
  315.     add.w    d0,pv_por(a1)
  316.     cmp.w    #-1019,pv_por(a1)
  317.     bge.s    .l3
  318.     move.w    #-1019,pv_por(a1)
  319.     bra.s    .l5
  320. .l3:    cmp.w    #1019,pv_por(a1)
  321.     ble.s    .l5
  322.     move.w    #1019,pv_por(a1)
  323.  
  324. .l5:    tst.b    pv_vibcnt(a1)
  325.     beq.s    .l7
  326.     move.w    pv_deltavib(a1),d0
  327.     add.w    d0,pv_vib(a1)
  328.     subq.b    #1,pv_vibcnt(a1)
  329.     bne.s    .l7
  330.     neg.w    pv_deltavib(a1)
  331.     move.b    pv_vibmax(a1),pv_vibcnt(a1)
  332.  
  333. .l7:    move.w    pv_dmacon(a1),d0
  334.  
  335.     move.w    pv_vol(a1),d1
  336.     bsr    JC_SetVoices
  337.  
  338.     move.w    pv_deltavol(a1),d0
  339.     add.w    d0,pv_vol(a1)
  340.     tst.w    pv_vol(a1)
  341.     bpl.s    .l8
  342.     clr.w    pv_vol(a1)
  343.     bra.s    .la
  344. .l8:    cmp.w    #$40,pv_vol(a1)
  345.     ble.s    .la
  346.     move.w    #$40,pv_vol(a1)
  347.  
  348. .la:    btst    #1,pv_flags(a1)
  349.     beq.s    .l10
  350.     tst.w    pv_deltaphase(a1)
  351.     beq.s    .l10
  352.     bpl.s    .sk
  353.     clr.w    pv_deltaphase(a1)
  354. .sk:    move.l    pv_insaddress(a1),a0
  355.     move.w    (a1),d0        ;pv_waveoffset
  356.     neg.w    d0
  357.     lea    (a0,d0.w),a2
  358.     move.l    a2,a3
  359.     move.w    pv_phase(a1),d0
  360.     lsr.w    #2,d0
  361.     add.w    d0,a3
  362.  
  363.     moveq    #$40-1,d0
  364. .lb:    move.b    (a2)+,d1
  365.     ext.w    d1
  366.     move.b    (a3)+,d2
  367.     ext.w    d2
  368.     add.w    d1,d2
  369.     asr.w    #1,d2
  370.     move.b    d2,(a0)+
  371.     dbra    d0,.lb
  372.  
  373.     move.w    pv_deltaphase(a1),d0
  374.     add.w    d0,pv_phase(a1)
  375.     cmp.w    #$100,pv_phase(a1)
  376.     blt.s    .l10
  377.     sub.w    #$100,pv_phase(a1)
  378.  
  379. .l10:    rts
  380.  
  381. pp_rot:    move.w    pv_pers(a1),d0
  382.     move.w    pv_pers+2(a1),pv_pers(a1)
  383.     move.w    pv_pers+4(a1),pv_pers+2(a1)
  384.     move.w    d0,pv_pers+4(a1)
  385.     rts
  386.  
  387. pp_nwnt:move.l    pp_address(PC),a0
  388.     add.l    #4*nt_sizeof,pp_address
  389.     subq.b    #1,pp_notecnt
  390.     bne.s    .l5
  391.  
  392. .l0:    addq.l    #2,pp_songptr
  393.     subq.w    #1,pp_songcnt
  394.     bne.s    .l1
  395.  
  396.     move.l    songtable(PC),pp_songptr
  397.     move.w    songlen(PC),pp_songcnt
  398. .l1:    move.l    pp_songptr(PC),a1
  399.     move.w    (a1),d0
  400.     mulu    #pt_sizeof,d0
  401.     add.l    patttable(PC),d0
  402.     move.l    d0,a1
  403.     move.b    pt_size+1(a1),pp_notecnt
  404.     move.l    pt_address(a1),pp_address
  405.  
  406. .l5:    clr.w    pp_tmpdmacon
  407.     lea    pp_variables(PC),a1
  408.     bsr    pp_nnt
  409.     addq.w    #nt_sizeof,a0
  410.     lea    pp_variables+pv_sizeof(PC),a1
  411.     bsr    pp_nnt
  412.     addq.w    #nt_sizeof,a0
  413.     lea    pp_variables+2*pv_sizeof(PC),a1
  414.     bsr    pp_nnt
  415.     addq.w    #nt_sizeof,a0
  416.     lea    pp_variables+3*pv_sizeof(PC),a1
  417.     bsr    pp_nnt
  418.  
  419.     move.w    pp_tmpdmacon(PC),$96(a6)
  420.  
  421.     bsr    Dmawait
  422.  
  423.     lea    pp_variables(PC),a1
  424.     bsr.s    pp_scr
  425.     lea    pp_variables+pv_sizeof(PC),a1
  426.     bsr.s    pp_scr
  427.     lea    pp_variables+2*pv_sizeof(PC),a1
  428.     bsr.s    pp_scr
  429.     lea    pp_variables+3*pv_sizeof(PC),a1
  430.     bsr.s    pp_scr
  431.  
  432.     bset    #7,pp_tmpdmacon
  433.     move.w    pp_tmpdmacon(PC),$96(a6)
  434.  
  435.     bsr    Dmawait
  436.  
  437.     move.l    pp_variables+pv_insaddress(PC),$A0(a6)
  438.     move.w    pp_variables+pv_inslen(PC),$A4(a6)
  439.     move.l    pp_variables+pv_sizeof+pv_insaddress(PC),$B0(a6)
  440.     move.w    pp_variables+pv_sizeof+pv_inslen(PC),$B4(a6)
  441.     move.l    pp_variables+2*pv_sizeof+pv_insaddress(PC),$C0(a6)
  442.     move.w    pp_variables+2*pv_sizeof+pv_inslen(PC),$C4(a6)
  443.     move.l    pp_variables+3*pv_sizeof+pv_insaddress(PC),$D0(a6)
  444.     move.w    pp_variables+3*pv_sizeof+pv_inslen(PC),$D4(a6)
  445.  
  446. pp_rts    rts
  447.  
  448. pp_scr:    move.w    pp_tmpdmacon(PC),d0
  449.     and.w    pv_dmacon(a1),d0
  450.     beq.s    pp_rts
  451.  
  452.     move.l    pv_custbase(a1),a0
  453.  
  454.     move.l    pv_insaddress(a1),(a0)
  455.     move.w    pv_inslen(a1),4(a0)
  456.     move.w    pv_pers(a1),6(a0)
  457.  
  458.     bsr    JC_GetVoice
  459.  
  460.     btst    #0,pv_flags(a1)
  461.     bne.s    pp_rts
  462.     move.l    #pp_nullwave,pv_insaddress(a1)
  463.     move.w    #1,pv_inslen(a1)
  464.     bra    jc_zeroadr
  465. pp_nnt:    move.b    (a0),d1        ;nt_period
  466.     beq    .l5
  467.  
  468.     and.l    #$000000FF,d1
  469.     add.w    d1,d1
  470.     add.l    #pp_periods-2,d1
  471.     move.l    d1,a2
  472.  
  473.     btst    #6,nt_speed(a0)
  474.     beq.s    .l2
  475.     move.w    (a2),pv_porlevel(a1)
  476.     bra.s    .l5
  477.  
  478. .l2:    move.w    pv_dmacon(a1),d0
  479.     or.w    d0,pp_tmpdmacon
  480.  
  481.     move.l    a2,pv_peraddress(a1)
  482.     move.w    (a2),pv_pers(a1)
  483.     move.w    (a2),pv_pers+2(a1)
  484.     move.w    (a2),pv_pers+4(a1)
  485.  
  486.     clr.w    pv_por(a1)
  487.  
  488.     move.b    nt_instr(a0),d0
  489.     ext.w    d0
  490.     mulu    #it_sizeof,d0
  491.     add.l    instable(PC),d0
  492.     move.l    d0,a2
  493.     tst.l    it_address(a2)
  494.     bne.s    .l1
  495.     move.l    #pp_nullwave,pv_insaddress(a1)
  496.     move.w    #1,pv_inslen(a1)
  497.     clr.b    pv_flags(a1)
  498.     bra.s    .l5
  499.  
  500. .l1:    move.l    it_address(a2),a3
  501.     btst    #1,it_flags(a2)
  502.     bne.s    .l0a
  503.     move.l    it_size(a2),d0
  504.     lsr.l    #1,d0
  505.     move.w    d0,pv_inslen(a1)
  506.     bra.s    .l0
  507. .l0a:    move.w    (a1),d0        ;pv_waveoffset
  508.     add.w    d0,a3
  509.     move.w    #$20,pv_inslen(a1)
  510. .l0:    move.l    a3,pv_insaddress(a1)
  511.     move.b    it_flags(a2),pv_flags(a1)
  512.     move.w    pv_vollevel(a1),pv_vol(a1)
  513.  
  514. .l5:    move.b    nt_speed(a0),d0
  515.     and.b    #$0F,d0
  516.     beq.s    .l6
  517.     move.b    d0,pp_wait
  518.  
  519. .l6:    move.l    pv_peraddress(a1),a2
  520.     move.b    nt_arpeggio(a0),d0
  521.     beq.s    .l9
  522.     cmp.b    #$FF,d0
  523.     bne.s    .l7
  524.     move.w    (a2),pv_pers(a1)
  525.     move.w    (a2),pv_pers+2(a1)
  526.     move.w    (a2),pv_pers+4(a1)
  527.     bra.s    .l9
  528.  
  529. .l7:    and.b    #$0F,d0
  530.     add.b    d0,d0
  531.     ext.w    d0
  532.     move.w    (a2,d0.w),pv_pers+4(a1)
  533.     move.b    nt_arpeggio(a0),d0
  534.     lsr.b    #4,d0
  535.     add.b    d0,d0
  536.     ext.w    d0
  537.     move.w    (a2,d0.w),pv_pers+2(a1)
  538.     move.w    (a2),pv_pers(a1)
  539.  
  540. .l9:    move.b    nt_vibrato(a0),d0
  541.     beq.s    .ld
  542.     cmp.b    #$FF,d0
  543.     bne.s    .la
  544.     clr.l    pv_vib(a1)
  545.     clr.b    pv_vibcnt(a1)
  546.     bra.s    .ld
  547. .la:    clr.w    pv_vib(a1)
  548.     and.b    #$0F,d0
  549.     ext.w    d0
  550.     move.w    d0,pv_deltavib(a1)
  551.     move.b    nt_vibrato(a0),d0
  552.     lsr.b    #4,d0
  553.     move.b    d0,pv_vibmax(a1)
  554.     lsr.b    #1,d0
  555.     move.b    d0,pv_vibcnt(a1)
  556.  
  557. .ld:    move.b    nt_phase(a0),d0
  558.     beq.s    .l10
  559.     cmp.b    #$FF,d0
  560.     bne.s    .le
  561.     clr.w    pv_phase(a1)
  562.     move.w    #$FFFF,pv_deltaphase(a1)
  563.     bra.s    .l10
  564. .le:    and.b    #$0F,d0
  565.     ext.w    d0
  566.     move.w    d0,pv_deltaphase(a1)
  567.     clr.w    pv_phase(a1)
  568. .l10:    move.b    nt_volume(a0),d0
  569.     bne.s    .l10a
  570.     btst    #7,nt_speed(a0)
  571.     beq.s    .l16
  572.     bra.s    .l11a
  573. .l10a:    cmp.b    #$FF,d0
  574.     bne.s    .l11
  575.     clr.w    pv_deltavol(a1)
  576.     bra.s    .l16
  577. .l11:    btst    #7,nt_speed(a0)
  578.     beq.s    .l12
  579. .l11a:    move.b    d0,pv_vol+1(a1)
  580.     move.b    d0,pv_vollevel+1(a1)
  581.     clr.w    pv_deltavol(a1)
  582.     bra.s    .l16
  583. .l12:    bclr    #7,d0
  584.     beq.s    .l13
  585.     neg.b    d0
  586. .l13:    ext.w    d0
  587.     move.w    d0,pv_deltavol(a1)
  588.  
  589. .l16:    move.b    nt_porta(a0),d0
  590.     beq.s    .l1a
  591.     cmp.b    #$FF,d0
  592.     bne.s    .l17
  593.     clr.l    pv_por(a1)
  594.     bra.s    .l1a
  595. .l17:    clr.w    pv_por(a1)
  596.     btst    #6,nt_speed(a0)
  597.     beq.s    .l17a
  598.     move.w    pv_porlevel(a1),d1
  599.     cmp.w    pv_pers(a1),d1
  600.     bgt.s    .l17c
  601.     neg.b    d0
  602.     bra.s    .l17c
  603.  
  604. .l17a:    bclr    #7,d0
  605.     bne.s    .l18
  606.     neg.b    d0
  607.     move.w    #135,pv_porlevel(a1)
  608.     bra.s    .l17c
  609.  
  610. .l18:    move.w    #1019,pv_porlevel(a1)
  611. .l17c:    ext.w    d0
  612. .l18a:    move.w    d0,pv_deltapor(a1)
  613.  
  614. .l1a:    rts
  615.  
  616. Dmawait
  617.     movem.l    d0/d1,-(sp)
  618.     moveq    #7,d1
  619. .wait    move.b    $dff006,d0
  620. .wait2    cmp.b    $dff006,d0
  621.     beq.s    .wait2
  622.     dbf    d1,.wait
  623.     movem.l    (sp)+,d0/d1
  624.     rts
  625.  
  626.     *** Data section ***
  627.  
  628. pp_periods:    DC.W    1019,962,908,857,809,763,720,680,642,606,572,540
  629.         DC.W    509,481,454,428,404,381,360,340,321,303,286,270
  630.         DC.W    254,240,227,214,202,190,180,170,160,151,143,135
  631.         DC.W    135,135,135,135,135,135,135,135,135
  632.         DC.W    135,135,135,135,135,135
  633.  
  634. songlen:    DS.W    1
  635. songtable:    DS.L    1
  636. instable:    DS.L    1
  637. patttable:    DS.L    1
  638.  
  639. pp_wait:    DS.B    1
  640. pp_waitcnt:    DS.B    1
  641. pp_notecnt:    DS.B    1
  642.     even
  643. pp_address:    DS.L    1
  644. pp_songptr:    DS.L    1
  645. pp_songcnt:    DS.W    1
  646. pp_pattentry:    DS.L    1
  647. pp_tmpdmacon:    DS.W    1
  648.  
  649. pp_variables:    DS.B    4*pv_sizeof
  650.  
  651.     *** Chip section ***
  652.  
  653. pp_nullwave:    DS.L    1
  654.  
  655.  
  656.